/*************************************************************************
	> File Name: 001.HZOJ330.cpp
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 一  2/22 17:22:49 2021
 ************************************************************************/

/**
 *题目描述
给出了一个长度为𝑁的序列，元素下标从 1 到 𝑁，你需要处理如下两种询问。
"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。
"Q a b" 询问[a, b]区间中所有值的和。

输入
第一行包含两个整数𝑁,𝑀(1≤𝑁,𝑀≤100000)，代表序列的长度和询问的次数.
第二行包含𝑁个整数，表示初始的序列𝐴(−1000000000≤𝐴𝑖≤1000000000)。
接下来𝑀行询问，格式如题目描述。

输出
对于每次𝑄查询，输出一行为查询的值。
 *
 */

#include <iostream>
using namespace std;

#define lowbit(x) (x & -x)
#define MAX_N 100000
long long c[2][MAX_N + 5]; //两个树状数组

void add(long long k, long long i, long long x, long long n) {
    while (i <= n) {
        c[k][i] += x;
        i += lowbit(i);
    }
    return ;
}

long long query(long long k, long long i) {
    long long sum = 0;
    while (i) {
        sum += c[k][i];
        i -= lowbit(i);
    }
    return sum;
}

long long S(long long i) {
    return (i + 1) * query(0, i) - query(1, i);
}

void modify(long long i, long long x, long long n) {
    add(0, i, x, n);
    add(1, i, i * x, n);
    return ;
}

int main() {
    long long n, m;
    scanf("%lld%lld", &n, &m);
    for (long long i = 1, pre = 0, a; i <= n; i++) {
        scanf("%lld", &a);
        modify(i, a - pre, n);
        pre = a;
    }
    char s[10];
    for (long long i = 0, l, r, d; i < m; i++) {
        scanf("%s", s);
        switch (s[0]) {
            case 'C': {
                scanf("%lld%lld%lld", &l, &r, &d);
                modify(l, d, n);
                modify(r + 1, -d, n);
            } break;
            case 'Q': {
                scanf("%lld%lld", &l, &r);
                printf("%lld\n", S(r) - S(l - 1));
            } break;
        }
    }

    return 0;
}
